import json

from django.shortcuts import render
from django.views import View
from django.http import JsonResponse

from book.models import BookInfo
from book.serializers import BookInfoSerialzier


# Create your views here.
class BooksView(View):

    def post(self, request):
        """
            保存图书
        :param request:
        :return:
        """
        # 1、获取前端数据
        data = request.body.decode()
        data_dict = json.loads(data)

        # 反序列化的验证步骤
        # 1-生成序列化器类对象，在初始化时将验证的字典数据传递给data参数
        ser = BookInfoSerialzier(data=data_dict)

        # # ---------------第一种验证方法的使用--------------
        # # 2-调用验证方法
        # res = ser.is_valid() # True或False
        # # 3-验证失败获取失败的错误信息
        # if not res:
        #     return JsonResponse({'error': ser.errors})

        # ---------------第二种验证方法的使用--------------
        # raise_exception选项作用: 验证失败抛出异常
        try:
            ser.is_valid(raise_exception=True)
        except:
            return JsonResponse({'error': ser.errors})

        # 获取验证成功后的数据 验证失败validated_data是空值
        validated_data = ser.validated_data
        # print(validated_data)

        # 3.保存图书save()会去调用序列化器中封装的create方法进行数据库保存
        ser.save()
        # 4、返回结果
        # 使用序列化器进行序列化操作
        # 2-提取对象序列化后的字段数据
        data = ser.data
        return JsonResponse(data)

    def get(self, request):
        """
            获取所有图书
        :param request:
        :return:
        """
        # 1、查询数据库获取所有图书
        books = BookInfo.objects.all()

        # 3、返回结果
        # 多个模型类对象序列化返回
        # 1-生成序列化器类对象,在初始化时将获取到的
        # 模型类对象当成参数出入序列化器类中,
        # 传的参数中需要多增加一个many=Ture
        ser = BookInfoSerialzier(books, many=True)
        book_list = ser.data
        return JsonResponse({'book_list': book_list})


class BookView(View):

    def get(self, request, pk):
        """
            获取单一图书
        :param request:
        :return:
        """
        # 1、根据id值查询数据库
        try:
            book = BookInfo.objects.get(id=pk, is_delete=False)
        except:
            return JsonResponse({'error': 'id不存在'}, status=400)
        # 2、返回数据
        return JsonResponse({
            'id': book.id,
            'btitle': book.btitle,
            'bpub_date': book.bpub_date,
            'bread': book.bread,
            'bcomment': book.bcomment
        })

    def put(self, request, pk):
        """
            更新图书
        :param request:
        :return:
        """
        # 1、获取前端数据
        data = request.body.decode()
        data_dict = json.loads(data)

        # 获取更新后的数据
        # 验证数据  更新数据时,序列化器初始化除了传递验证的字典数据外，还需要传递更新的数据对象
        book = BookInfo.objects.get(id=pk)
        ser = BookInfoSerialzier(book, data=data_dict)
        try:
            ser.is_valid(raise_exception=True)
        except:
            return JsonResponse({'error': ser.errors})

        # 3、验证成功，更新数据
        ser.save()

        # 4、返回结果
        return JsonResponse(ser.data)

    def delete(self, request, pk):
        """
              删除图书
          :param request:
          :return:
         """
        # 1、根据id值查询数据库,获取删除的图书
        try:
            book = BookInfo.objects.get(id=pk)
        except:
            return JsonResponse({'error': 'id不存在'}, status=400)

        # 2、删除图书  逻辑删除 物理删除
        # book.delete()# 物理删除
        book.is_delete = True
        book.save()
        return JsonResponse({})